// app.js
// 导入封装的处理小程序登录的事件
import { 
  getLoginCode, // 用户登录，获取 code
  codeToToken, // 发送 code 给服务器，换取一个 token 给客户端
  checkToken, // 检查 token 是否过期
  checkSession // 检车 session_key 是否过期
} from "./service/api_login"; 

// 导入 token 常量
import { TOKEN_KEY } from "./constants/token-const";

App({
  // ======================================== 数据  ========================================
  // 全局的数据对象
  globalData: {
    screenWidth: 0, // 屏幕宽度
    screenHeight: 0, // 屏幕高度
    statusBarHeight: 0, // 设备状态栏高度
    navBarHeight: 44, // 导航栏高度
    deviceRadio: 0, // 设备高宽比
  },

  // ======================================== 声明周期  ========================================
  // 页面启动的生命周期
  onLaunch() {
    // 1、获取设备信息
    const info = wx.getSystemInfoSync(); // 初始化获取页面信息
    this.globalData.screenWidth = info.screenWidth; // 屏幕宽度
    this.globalData.screenHeight = info.screenHeight; // 屏幕宽度
    this.globalData.statusBarHeight = info.statusBarHeight; // 设备状态栏高度
    
    // 设备高宽比
    const deviceRadio = info.screenHeight / info.screenWidth; 
    this.globalData.deviceRadio = deviceRadio;

    // 2、让用户默认进行登录
    this.handleLoginCheck();
  },

  // ======================================== 事件操作  ========================================
  // 登录前的判断
  async handleLoginCheck() {
    const token = wx.getStorageSync(TOKEN_KEY); // 获取本地的 token

    // 判断 token 是否过期
    const checkResult = await checkToken(); // 服务器返回的检查结果，失败的话会返回 errorCode
    // 判断 session_key 是否过期
    const isSessionExpire = await checkSession();

    // 如果本地没有 token ，或者 token 过期，或者 session_key 过期，那么才发送登录请求
    if(!token || checkResult.errorCode || !isSessionExpire) {
      this.loginAction(); // 调用登录事件
    }
  },

  // 用户登录的事件
  async loginAction() {
    // 1、获取 code
    const code = await getLoginCode();
    
    // 2、将 code 发送给服务器
    const result = await codeToToken(code);
    const token = result.token; // 获取 token
    wx.setStorageSync(TOKEN_KEY, token); // 将 token 保存在本地
  }
});
